package com.odontosis.view.paciente.pagamento;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.odontosis.acesso.filtro.PermissaoAcesso;
import com.odontosis.entidade.GrupoUsuario;
import com.odontosis.entidade.Paciente;
import com.odontosis.entidade.Pagamento;
import com.odontosis.entidade.Usuario;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.service.PacienteService;
import com.odontosis.service.PagamentoService;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisAction;

public class AcaoPagamento extends OdontosisAction<PagamentoService> {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		FormPagamento formulario = (FormPagamento) form;
		if(!StringUtilsOdontosis.isVazia(formulario.getMetodo())){
			if(formulario.getMetodo().equals("isentar")){
				return isentar(mapping, form, request, response);
			}
			if(formulario.getMetodo().equals("justificar")){
				return onJustificar(mapping, form, request, response);
			}
			if(formulario.getMetodo().equals("pesquisar")){
				return onPesquisar(mapping, form, request, response);
			}
		}
		return onIniciar(mapping, form, request, response);
	}
	
	public ActionForward onIniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)	throws Exception {
		FormPagamento formulario = (FormPagamento) form;
		Paciente paciente = (Paciente) request.getSession().getAttribute("pacientePagamento");
		if(paciente != null) {
			formulario.setPacienteId(paciente.getId().toString());
			formulario.setNomePaciente(paciente.getDescricaoAutoComplete());
			request.getSession().setAttribute("pacientePagamento", null);
		}
		return onPesquisar(mapping, form, request, response);
	}
	
	public ActionForward onJustificar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)	throws Exception {
		FormPagamento formulario = (FormPagamento) form;
		Pagamento pagamento = service.load(Long.parseLong(formulario.getNumeroPagamento()));
		pagamento.setJustificativa(formulario.getJustificativa());
		service.update(pagamento);
		
		formulario.setMetodo(null);
		Collection<String> sucesso = new ArrayList<String>();
		sucesso.add("Justificativa inserida com sucesso.");
		request.setAttribute("sucesso", sucesso);
		request.setAttribute("mensagens", null);
		return onPesquisar(mapping, form, request, response);
	}
	
	public ActionForward isentar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
		PermissaoAcesso.verificarAcesso(mapping, form, request, response, GrupoUsuario.ADMIN, GrupoUsuario.THD);
		
		FormPagamento formulario = (FormPagamento) form;
		formulario.setMetodo(null);
		PagamentoService service = ContainerIoc.getPagamentoService();
		Pagamento pagamento = service.load(Long.parseLong(formulario.getNumeroPagamento()));
		pagamento.setPago(true);
		pagamento.setUsuarioCancelamento(usuario);
		service.update(pagamento);
		
		Collection<String> sucesso = new ArrayList<String>();
		sucesso.add("A parcela foi isenta com sucesso.");
		request.setAttribute("sucesso", sucesso);
		request.setAttribute("mensagens", null);
		
		return onPesquisar(mapping, form, request, response);
	}
	
	public ActionForward onPesquisar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		FormPagamento formulario = (FormPagamento) form;
		if(StringUtilsOdontosis.isVazia(formulario.getPacienteId())){
			formulario.setInicio(true);
		}

		Integer anoVencimento = StringUtilsOdontosis.isInteger(formulario.getAnoVencimento())?Integer.parseInt(formulario.getAnoVencimento()):null;
		Integer mesVencimentoInicial = StringUtilsOdontosis.isInteger(formulario.getMesVencimento())?Integer.parseInt(formulario.getMesVencimento()):null;
		Integer mesVencimentoFinal = StringUtilsOdontosis.isInteger(formulario.getMesVencimentoFinal())?Integer.parseInt(formulario.getMesVencimentoFinal()): null;
		if(!StringUtilsOdontosis.isVazia(formulario.getPacienteId()) && !StringUtilsOdontosis.isVazia(formulario.getAnoVencimento())){
			request.getSession().setAttribute("pacienteId", new Long(formulario.getPacienteId()));
			request.getSession().setAttribute("ano", anoVencimento);
			request.getSession().setAttribute("mesInicio", mesVencimentoInicial);
			request.getSession().setAttribute("mesFim", mesVencimentoFinal);
		}
		
		List<Pagamento> pagamentos = new ArrayList<Pagamento>();
		if(!formulario.isInicio()){
			PacienteService pacienteService = new PacienteService();
			Paciente paciente = pacienteService.load(Long.parseLong(formulario.getPacienteId()));
			
			service.gerarTaxasManutencao(paciente);
			
			pagamentos.addAll(service.buscarPagamentosPorDataEPaciente(anoVencimento, mesVencimentoInicial, 
						mesVencimentoFinal,Long.parseLong(formulario.getPacienteId())));
			
//			for(Pagamento pagamento : pagamentos){
//				//service.getSession().refresh(pagamento);
//			}
			
			formulario.setPesquisou(true);
			
			formulario.setNomePaciente(paciente.getDescricaoAutoComplete());
			formulario.setNumeroPaciente(paciente.getNumeroPasta());

		}
		
		request.setAttribute("pagamentos", pagamentos);
		
		return mapping.getInputForward();
	}

	
}
